1 Library

library(tidyverse)
library(tictoc)
library(patchwork)
library(smatr)
library(ggpubr)
library(ggsma)
library(kableExtra)
source("../scripts/util.R")
theme_set(theme_bw())
theme_update(text = element_text(family = "Arial"))

2 Datasets

d <- read_csv("../data/full_data.csv")
d_cv <- read_csv("../data/full_data_cv.csv")

d <- d |>
  filter(!is.na(LMAdisc)) |>
  filter(!is.na(LMAleaf)) |>
  filter(!is.na(LTleaf)) |>
  rename(LT = LTleaf) |>
  rename(LA = LAleaf) |>
  filter(Location %in% c("Ailao_understory", "Mengla_Bubeng", "Yuanjiang_Savanna", "Yakushima")) |>
  #filter(Location != "Yakushima") |>
  mutate(LMAratio = LMAleaf / LMAdisc) |>
  mutate(LDratio = LDleaf / LDdisc)

LA1 <- quantile(d$LA, 0.25, na.rm = TRUE)
LA2 <- quantile(d$LA, 0.5, na.rm = TRUE)
LA3 <- quantile(d$LA, 0.75, na.rm = TRUE)
LT1 <- quantile(d$LT, 0.25, na.rm = TRUE)
LT2 <- quantile(d$LT, 0.5, na.rm = TRUE)
LT3 <- quantile(d$LT, 0.75, na.rm = TRUE)

LA_mid <- median(d$LA)
LT_mid <- median(d$LT, na.rm = TRUE)

d <- d |>
  mutate(LT_gr = case_when(
    LT < LT1 ~ "Very~thin",
    LT < LT2 ~ "Thin",
    LT < LT3 ~ "Thick",
    TRUE ~ "Very~thick")) |>
  mutate(LT_gr = factor(LT_gr, levels = c("Very~thin", "Thin", "Thick",
                                          "Very~thick"))) |>
  mutate(LA_gr = case_when(
    LA < LA1 ~ "Very~small",
    LA < LA2 ~ "Small",
    LA < LA3 ~ "Large",
    TRUE ~ "Very~large")) |>
  mutate(LA_gr = factor(LA_gr, levels = c("Very~small", "Small", "Large",
                                          "Very~large"))) |>
  mutate(LALT_gr = case_when(
   LA < LA_mid & LT < LT_mid ~ "Thin~Small",
   LA < LA_mid & LT >= LT_mid ~ "Thick~Small",
   LA >= LA_mid & LT < LT_mid ~ "Thin~Large",
   LA >= LA_mid & LT >= LT_mid ~ "Thick~Large",
   TRUE ~ "aa"
                          )) |>
  mutate(LA_gr2 = ifelse(LA < LA_mid, "Small-leaved~species",
                         "Large-leaved~species")) |>
  mutate(LT_gr2 = ifelse(LT < LT_mid, "Thin-leaved~species",
                         "Thick-leaved~species"))

d_cv <- d_cv |>
  dplyr::select(Species, Location,
                LMAleaf_cv = LMAleaf, LMAdisc_cv = LMAdisc,
                LDleaf_cv = LDleaf, LDdisc_cv = LDdisc) |>
  #full_join(d) |>
  filter(!is.na(LMAleaf_cv)) |>
  filter(!is.na(LMAdisc_cv))


d_cv2 <- d_cv |>
  full_join(d) |>
  filter(!is.na(LMAleaf_cv)) |>
  filter(!is.na(LMAdisc_cv))

d %>%
  head %>%
  kable() %>%
  kable_styling()
Species Family Growthform EveDec LeafType Location Garden MAT MAP Biomes Contributor LMAdisc LMAleaf LDdisc LDleaf LDMCdisc LDMCleaf LT LTdisc LA LMAratio LDratio LT_gr LA_gr LALT_gr LA_gr2 LT_gr2
Lithocarpus pachyphyllus Fagaceae T E S Ailao_understory NO NA NA STF Chen Yajun 132.76613 138.37018 0.3628966 0.4706799 0.4581964 0.4441105 0.2941667 0.3450556 67.28300 1.0422100 1.297008 Thick Very~large Thick~Large Large-leaved~species Thick-leaved~species
Ternstroemia gymnanthera Pentaphylacaceae T E S Ailao_understory NO NA NA STF Chen Yajun 130.18236 156.72891 0.2538547 0.3118546 0.3792584 0.3750513 0.5020556 0.4817222 22.29350 1.2039182 1.228477 Very~thick Small Thick~Small Small-leaved~species Thick-leaved~species
Lyonia ovalifolia Ericaceae T D S Ailao_understory NO NA NA STF Chen Yajun 65.38931 82.84796 0.2734705 0.3671061 0.3620187 0.4093258 0.2261667 0.2203889 48.71267 1.2669956 1.342398 Thin Large Thin~Large Large-leaved~species Thin-leaved~species
Litsea cubeba Lauraceae T D S Ailao_understory NO NA NA STF Chen Yajun 63.99804 63.19796 0.2988204 0.3099342 0.3670618 0.3058718 0.2034444 0.2015556 26.06800 0.9874983 1.037192 Very~thin Small Thin~Small Small-leaved~species Thin-leaved~species
Viburnum cylindricum Adoxaceae T E S Ailao_understory NO NA NA STF Chen Yajun 92.61829 119.09017 0.2716369 0.3367223 0.3344615 0.3418213 0.3539444 0.3234444 57.21067 1.2858171 1.239604 Very~thick Very~large Thick~Large Large-leaved~species Thick-leaved~species
Styrax perkinsiae Styracaceae T D S Ailao_understory NO NA NA STF Chen Yajun 70.75560 83.62315 0.3785759 0.4018702 0.4303001 0.4229883 0.2170000 0.1771111 36.99783 1.1818591 1.061531 Very~thin Large Thin~Large Large-leaved~species Thin-leaved~species

3 Leaf disc vs whole-leaf LMA (species-level)

3.1 Pooled

p_LALT_grid <- d |>
  ggplot(aes(x = LMAdisc, y = LMAleaf)) +
  geom_point(alpha = 0.8) +
  scale_x_log10() +
  scale_y_log10() +
  geom_abline(slope = 1, intercept = 0, lty = 2) +
  geom_sma(se = TRUE) +
  facet_grid(LA_gr2~LT_gr2, scale = "free", labeller = label_parsed) +
  #facet_wrap(~LALT_gr, scale = "fixed", labeller = label_parsed) +
  xlab(expression(Leaf~disc~LMA~(g~m^{-2}))) +
  ylab(expression(Whole-leaf~LMA~(g~m^{-2}))) +
  stat_cor(
    aes(label = paste(..rr.label.., ..n.label.., sep = "~`,`~"), family = "Arial")
  )

ggsave("../figs/LMA_sp_gr.png", p_LALT_grid, width = 6, height = 6)

3.2 Separated

my_col <- RColorBrewer::brewer.pal(4, "RdBu")

p_LALT_grid_both <- d |>
  mutate(punch_size = ifelse(Location == "Yakushima", "1.0 cm", "0.6 cm")) |>
  ggplot(aes(x = LMAdisc, y = LMAleaf, col = punch_size)) +
  geom_point(alpha = 0.6) +
  scale_x_log10() +
  scale_y_log10() +
  geom_abline(slope = 1, intercept = 0, lty = 2) +
  geom_sma(se = FALSE) +
  scale_color_manual(values = my_col[c(2, 4)],
                     name = "Diameter of the leaf punch") +
  facet_grid(LA_gr2~LT_gr2, scale = "free", labeller = label_parsed) +
  #facet_wrap(~LALT_gr, scale = "fixed", labeller = label_parsed) +
  xlab(expression(Leaf~disc~LMA~(g~m^{-2}))) +
  ylab(expression(Whole-leaf~LMA~(g~m^{-2}))) +
  stat_cor(
    aes(label = paste(..rr.label.., ..n.label.., sep = "~`,`~"), family = "Arial"),
    show.legend = FALSE
  ) +
 theme(legend.position = c(0.3, 0.1),
        legend.key.size = unit(0.5, "cm"),
        legend.spacing.y = unit(0.1, "cm"),
        legend.text.align = 0,
        legend.key.height = unit(0.2, "cm"),
        legend.text = element_text(size = 9),
        legend.title = element_text(size = 9)
 )

ggsave("../figs/LMA_sp_gr_both.png", p_LALT_grid_both, width = 6, height = 6)

4 SMA table (species-level)

sma_LMA <- sma(log10(LMAleaf) ~ log10(LMAdisc),
    data = d,
    elev.test = 0,
    slope.test = 1)

sma_LD <- sma(log10(LDleaf) ~ log10(LDdisc),
    data = d,
    elev.test = 0,
    slope.test = 1)

sma_LMA_LALT_gr <- sma(log10(LMAleaf) ~ log10(LMAdisc) * LALT_gr,
    data = d,
    elev.test = 0,
    slope.test = 1)

sma_LD_LALT_gr <- sma(log10(LDleaf) ~ log10(LDdisc) * LALT_gr,
    data = d,
    elev.test = 0,
    slope.test = 1)

my_fun <- function(fit) {
  tb1 <- fit$groupsummary |>
    mutate(Slope = paste0(round(Slope, 2), " [", round(Slope_lowCI, 2), ", ",
                          round(Slope_highCI, 2), "]"))|>
    mutate(Intecept = paste0(round(Int, 2), " [", round(Int_lowCI, 2), ", ",
                          round(Int_highCI, 2), "]"))|>
    mutate(sig_slope = case_when(
                             Slope_highCI < 1 ~ "sig",
                             Slope_lowCI > 1 ~ "sig",
                             TRUE ~ "ns"
                             )) |>
    mutate(sig_int = ifelse(Int_lowCI * Int_highCI > 0, "sig", "ns")) |>
    mutate(r2 = round(r2, 2)) |>
    dplyr::select(Slope, Intecept, r2, sig_slope, sig_int, group)
  tb2 <- tb1 |>
    mutate(Slope = ifelse(sig_slope == "sig", paste0("**", Slope, "**"), Slope)) |>
    mutate(Intecept = ifelse(sig_int == "sig", paste0("**", Intecept, "**"),
                             Intecept)) |>
    dplyr::select(Slope, Intecept, `*R^2^*` = r2)
  list(tb1, tb2, group = tb1$group)
}


tb0_LMA <- my_fun(sma_LMA)
tb0_LD <- my_fun(sma_LD)
tb2_LMA <- my_fun(sma_LMA_LALT_gr)
tb2_LD <- my_fun(sma_LD_LALT_gr)

#tb_dat <- rbind(cbind(tb0_LMA[[2]], tb0_LD[[2]]),
#  cbind(tb2_LMA[[2]], tb2_LD[[2]]))

tb_dat <- rbind(tb0_LMA[[2]], tb2_LMA[[2]])
tb_dat <- cbind(c("All", tb2_LMA$group), tb_dat) |>
  as.data.frame()

tb_dat %>%
  write_csv("../data/tab1.csv")

colnames(tb_dat)[1] <- "Data"
rownames(tb_dat) <- NULL

tb_dat |>
  kable() |>
 #pack_rows("all", 1, 1) |>
 #pack_rows("Site", 2, 6) |>
 #add_header_above(c(" ", "LMA" = 3, "LD" = 3)) |>
  kable_styling()
Data Slope Intecept R2
All 0.97 [0.94, 1.01] 0.09 [0.02, 0.16] 0.87
Thick~Large 0.93 [0.85, 1.03] 0.19 [0.01, 0.37] 0.86
Thick~Small 1.02 [0.97, 1.07] 0 [-0.11, 0.11] 0.93
Thin~Large 0.91 [0.82, 1.02] 0.2 [0.02, 0.37] 0.71
Thin~Small 0.93 [0.83, 1.03] 0.16 [-0.02, 0.35] 0.84

5 Leaf disc vs whole-leaf LMA (individual-level)

tree <- read_csv("../data/tree_data.csv")

tree <- tree |>
  filter(!is.na(LMAdisc)) |>
  filter(!is.na(LMAleaf)) |>
  filter(!is.na(LTleaf)) |>
  rename(LT = LTleaf) |>
  rename(LA = LAleaf) |>
  mutate(Dry_mass_disc2 = case_when(
   Location == "Yakushima" ~ LMAdisc * 1.57 * 10^-4 / 2,
   TRUE ~ LMAdisc * 0.889 * 10^-4 / 3
                )) |>
  mutate(Dry_mass_disc = case_when(
   Location == "Yakushima" ~ LMAdisc * 1.57 * 10^-4,
   TRUE ~ LMAdisc * 0.889 * 10^-4
                ))

LA1_tree <- quantile(tree$LA, 0.25, na.rm = TRUE)
LA2_tree <- quantile(tree$LA, 0.5, na.rm = TRUE)
LA3_tree <- quantile(tree$LA, 0.75, na.rm = TRUE)
LT1_tree <- quantile(tree$LT, 0.25, na.rm = TRUE)
LT2_tree <- quantile(tree$LT, 0.5, na.rm = TRUE)
LT3_tree <- quantile(tree$LT, 0.75, na.rm = TRUE)

LA_mid_tree <- median(tree$LA, na.rm = TRUE)
LT_mid_tree <- median(tree$LT, na.rm = TRUE)

tree <- tree |>
  mutate(LT_gr = case_when(
    LT < LT1_tree ~ "Very~thin",
    LT < LT2_tree ~ "Thin",
    LT < LT3_tree ~ "Thick",
    TRUE ~ "Very~thick")) |>
  mutate(LT_gr = factor(LT_gr, levels = c("Very~thin", "Thin", "Thick",
                                          "Very~thick"))) |>
  mutate(LA_gr = case_when(
    LA < LA1_tree ~ "Very~small",
    LA < LA2_tree ~ "Small",
    LA < LA3_tree ~ "Large",
    TRUE ~ "Very~large")) |>
  mutate(LA_gr = factor(LA_gr, levels = c("Very~small", "Small", "Large",
                                          "Very~large"))) |>
  mutate(LALT_gr = case_when(
   LA < LA_mid_tree & LT < LT_mid_tree ~ "Thin~Small",
   LA < LA_mid_tree & LT >= LT_mid_tree ~ "Thick~Small",
   LA >= LA_mid_tree & LT < LT_mid_tree ~ "Thin~Large",
   LA >= LA_mid_tree & LT >= LT_mid_tree ~ "Thick~Large",
   TRUE ~ "aa"
                          )) |>
  mutate(LA_gr2 = ifelse(LA < LA_mid_tree, "Small-leaved~individuals",
                         "Large-leaved~individuals")) |>
  mutate(LT_gr2 = ifelse(LT < LT_mid_tree, "Thin-leaved~individuals",
                         "Thick-leaved~individuals"))
p_LALT_tree <- tree |>
  ggplot(aes(x = LMAdisc, y = LMAleaf, col = Dry_mass_disc)) +
  geom_point(alpha = 0.8) +
  scale_color_viridis_c(trans = "log10",
                        name = "Total dry mass of \nleaf discs (g)") +
  scale_x_log10() +
  scale_y_log10() +
  geom_abline(slope = 1, intercept = 0, lty = 2) +
  geom_sma(se = TRUE) +
  facet_grid(LA_gr2~LT_gr2, scale = "free", labeller = label_parsed) +
  xlab(expression(Leaf~disc~LMA~(g~m^{-2}))) +
  ylab(expression(Whole-leaf~LMA~(g~m^{-2}))) +
  stat_cor(
    aes(label = paste(..rr.label.., ..n.label.., sep = "~`,`~"), family = "Arial")
  ) +
  theme(legend.position = c(0.39, 0.15),
        legend.key.size = unit(0.5, "cm"),
        legend.spacing.y = unit(0.1, "cm"),
        legend.text.align = 0,
        legend.key.height = unit(0.3, "cm"),
        legend.text = element_text(size=7),
        legend.title = element_text(size=7))

ggsave("../figs/LMA_ind_gr.png", p_LALT_tree, width = 6, height = 6)

6 Divergence (species-level)

my_col <- RColorBrewer::brewer.pal(4, "RdBu")

LMAratio <- tree |>
  mutate(punch_size = ifelse(Location == "Yakushima", "1.0 cm", "0.6 cm")) |>
  ggplot(aes(Dry_mass_disc, LMAleaf / LMAdisc,
             col = punch_size
             )) +
  geom_point(alpha = 0.6) +
  geom_hline(yintercept = 1) +
  scale_color_manual(values = my_col[c(2, 4)],
                     name = "Diameter of the leaf punch") +
  xlab("Total dry mass of leaf disc (g)") +
  ylab("Whole-leaf LMA / leaf disc LMA") +
  theme(
        legend.position = c(0.7, 0.75),
        legend.key.size = unit(0.5, "cm"),
        legend.spacing.y = unit(0.1, "cm"),
        legend.text.align = 0,
        legend.key.height = unit(0.3, "cm"),
        legend.text = element_text(size=7),
        legend.title = element_text(size=7))

LMAratio_LT <- tree |>
  mutate(punch_size = ifelse(Location == "Yakushima", "1.0 cm", "0.6 cm")) |>
  ggplot(aes(LT, LMAleaf / LMAdisc,
            col = Dry_mass_disc
             )) +
  geom_point(alpha = 0.6) +
  geom_hline(yintercept = 1) +
  scale_color_viridis_c(trans = "log10",
                        name = "Total leaf disc \ndry mass (g)") +
  #scale_color_viridis_d() +
  scale_x_log10() +
  xlab("Leaf thickness (mm)") +
  ylab("Whole-leaf LMA / leaf disc LMA") +
  theme(
        legend.position = c(0.7, 0.75),
        legend.key.size = unit(0.5, "cm"),
        legend.spacing.y = unit(0.1, "cm"),
        legend.text.align = 0,
        legend.key.height = unit(0.3, "cm"),
        legend.text = element_text(size=7),
        legend.title = element_text(size=7))

LMAratio_LA <- tree |>
  mutate(punch_size = ifelse(Location == "Yakushima", "1.0 cm", "0.6 cm")) |>
  ggplot(aes(LA, LMAleaf / LMAdisc,
            col = Dry_mass_disc
             )) +
  geom_point(alpha = 0.6) +
  geom_hline(yintercept = 1) +
  scale_color_viridis_c(trans = "log10",
                        name = "Total leaf disc \ndry mass (g)") +
  #scale_color_viridis_d() +
  scale_x_log10() +
  xlab(expression(Leaf~area~(m^2))) +
  ylab("Whole-leaf LMA / leaf disc LMA") +
  theme(
        legend.position = "none",
        #legend.position = c(0.2, 0.75),
        legend.key.size = unit(0.5, "cm"),
        legend.spacing.y = unit(0.1, "cm"),
        legend.text.align = 0,
        legend.key.height = unit(0.3, "cm"),
        legend.text = element_text(size=7),
        legend.title = element_text(size=7))

p_ratio <- LMAratio + LMAratio_LT + LMAratio_LA +
  plot_annotation(tag_levels = "a")


ggsave("../figs/LMAratio2.png", p_ratio, width = 9, height = 3)

Check for heteroscedasticity.

#LMAratio
lmtest::bptest(lm(log(LMAleaf / LMAdisc) ~ log(Dry_mass_disc), tree))
## 
##  studentized Breusch-Pagan test
## 
## data:  lm(log(LMAleaf/LMAdisc) ~ log(Dry_mass_disc), tree)
## BP = 50.572, df = 1, p-value = 1.148e-12
lmtest::bptest(lm(log(LMAleaf / LMAdisc) ~ (Dry_mass_disc), tree))
## 
##  studentized Breusch-Pagan test
## 
## data:  lm(log(LMAleaf/LMAdisc) ~ (Dry_mass_disc), tree)
## BP = 41.48, df = 1, p-value = 1.191e-10
lmtest::bptest(lm(log(LMAleaf / LMAdisc) ~ log(LT), tree))
## 
##  studentized Breusch-Pagan test
## 
## data:  lm(log(LMAleaf/LMAdisc) ~ log(LT), tree)
## BP = 14.553, df = 1, p-value = 0.0001363
lmtest::bptest(lm(log(LMAleaf / LMAdisc) ~ log(LA), tree))
## 
##  studentized Breusch-Pagan test
## 
## data:  lm(log(LMAleaf/LMAdisc) ~ log(LA), tree)
## BP = 30.348, df = 1, p-value = 3.61e-08

7 LMA and LD (species-level)

d_leaf <- d |>
  dplyr::select(c(Species:Contributor, LMA = LMAleaf, LDMC = LDMCleaf, LD = LDleaf)) |>
  pivot_longer(LMA:LD, names_to = "trait", values_to = "Whole-leaf") |>
  filter(Location != "Yakushima" | trait != "LD") |>
  filter(Location != "Yakushima" | trait != "LMA")

d_disc <- d |>
  dplyr::select(Species, Location, LMA = LMAdisc, LDMC = LDMCdisc, LD = LDdisc) |>
  pivot_longer(LMA:LD, names_to = "trait", values_to = "Leaf Disc") |>
  filter(Location != "Yakushima" | trait != "LD") |>
  filter(Location != "Yakushima" | trait != "LMA")

d2 <- full_join(d_leaf, d_disc) |>
  mutate(trait = factor(trait, c("LMA", "LDMC", "LD"))) |>
  mutate(trait_lab = factor(trait,
                            labels = c("LMA~(g~m^{-2})",
                                       "LDMC~(g~g^{-1})",
                                       "LD~(g~cm^{-3})"
                            )))


p_all <- d2 |>
  filter(trait != "LDMC") |>
  ggplot(aes(x = `Leaf Disc`, y = `Whole-leaf`)) +
  geom_abline(intercept = 0, slope = 1, lty = 2) +
  geom_point(alpha = 0.6) +
  scale_x_log10() +
  scale_y_log10() +
#  geom_smooth(method = "lm", se = FALSE) +
  geom_sma(se = TRUE) +
  facet_wrap(~trait_lab, scale = "free", labeller = label_parsed) +
  stat_cor(
    #aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~"))
    aes(label = paste(..rr.label..,  ..n.label.., sep = "~`,`~"), family = "Arial")
 #   label.x = 2
  )


ggsave("../figs/fig1.png", p_all, width = 6, height = 3)

8 CV

p_cv1 <- d_cv |>
  ggplot(aes(x = LMAdisc_cv, y = LMAleaf_cv)) +
  geom_abline(intercept = 0, slope = 1, lty = 2) +
  geom_point(alpha = 0.6) +
  scale_x_continuous(trans = "sqrt", breaks = c(0.001, 0.01, 0.05, 0.1)) +
  scale_y_continuous(trans = "sqrt", breaks = c(0.001, 0.01, 0.05, 0.1)) +
  geom_sma(se = TRUE) +
  ylab("CV of whole-leaf LMA") +
  xlab("CV of leaf disc LMA") +
  coord_fixed() +
  stat_cor(
           label.x.npc = 0.3,
           label.y.npc = 0,
           vjust = 1.5,
           aes(label = paste(..rr.label..,  ..n.label.., sep = "~`,`~"), family = "Arial")
               )

p_cv2 <- d_cv |>
  filter(Location != "Yakushima") |>
  ggplot(aes(x = LMAdisc_cv, y = LMAleaf_cv)) +
  geom_abline(intercept = 0, slope = 1, lty = 2) +
  geom_point(alpha = 0.6) +
  scale_x_continuous(trans = "sqrt") +
  scale_y_continuous(trans = "sqrt") +
  geom_sma(se = TRUE) +
  ggtitle("Diameter: 0.6 cm") +
  ylab("CV of whole-leaf LMA") +
  xlab("CV of leaf disc LMA") +
  #coord_fixed(xlim = c(0.01, 5.4), ylim = c(0.01, 5.4)) +
  #coord_fixed() +
  stat_cor(
    aes(label = paste(..rr.label..,  ..n.label.., sep = "~`,`~"), family = "Arial")
  )

p_cv3 <- d_cv |>
  filter(Location == "Yakushima") |>
  ggplot(aes(x = LMAdisc_cv, y = LMAleaf_cv)) +
  geom_abline(intercept = 0, slope = 1, lty = 2) +
  geom_point(alpha = 0.6) +
  scale_x_continuous(trans = "sqrt") +
  scale_y_continuous(trans = "sqrt") +
  geom_sma(se = TRUE) +
  ggtitle("Diameter: 1.0 cm") +
  ylab("CV of whole-leaf LMA") +
  xlab("CV of leaf disc LMA") +
  #coord_fixed(xlim = c(0.01, 5.4), ylim = c(0.01, 5.4)) +
  #coord_fixed() +
  stat_cor(
    aes(label = paste(..rr.label..,  ..n.label.., sep = "~`,`~"), family = "Arial")
  )

p_cv <- (p_cv2 + p_cv3) +
  plot_annotation(tag_levels = "a")

ggsave("../figs/fig_cv2.png", p_cv, width = 6, height = 3)

ggsave("../figs/fig_cv.png", p_cv1, width = 3, height = 3)

8.1 Pooled

8.2 Separated

9 Leaf support cost (species-level)

d3 <- read_csv("../data-raw/leaf_traits_for_Katabuchi.csv")

yaku <- d3 |>
  filter(Growthform != "H") |>
  mutate(Location = "Yakushima") |>
  mutate(Biomes = "ST2") |>
  mutate(Garden = "NO") |>
  mutate(MAT = NA) |>
  mutate(MAP = NA) |>
  mutate(Contributor = "Onoda Yusuke") |>
  rename(
                LA = `LA mean (leaf let)`,
                LT = `Lamina thickness`,
                LMAdisc = `LD LMA`,
                LMAleaf = `Whole leaf LMA`,
                LDMCleaf = `LDMC`,
                LDdisc = `TD`
  ) |>
  mutate(LDleaf = LMAleaf / LT * 10^-3) %>%
  mutate(LDMCdisc = NA) |>
  mutate(LTdisc = NA) |>
  mutate(Growthform = ifelse(Growthform == "W", "Trees", Growthform)) |>
  mutate(petiole_ratio = `petiole DW`/`Scanned leaf DW`)

yaku_sp <- yaku |>
  group_by(Species) |>
  summarize_at(
               .vars = vars(
             LMAdisc,
             LMAleaf,
             LDMCdisc,
             LDMCleaf,
             LDdisc,
             LDleaf,
             LT,
             LTdisc,
             LA,
             petiole_ratio
               ),
    .funs =  \(x)mean(x, na.rm = TRUE)) |>
  filter(petiole_ratio > 0) |>
  filter(!is.na(LMAdisc))

pet1 <- ggplot(yaku_sp, aes(x = petiole_ratio, y = LMAleaf/LMAdisc)) +
  geom_point() +
  scale_x_log10() +
  #xlab(expression(Petiole/leaf~dry~mass~ratio(g~g^-1))) +
  xlab("Petiole / leaf dry mass ratio") +
  ylab("Whole-leaf / leaf disc LMA ratio") +
  geom_smooth(method = "lm") +
  stat_cor(
    aes(label = paste(..rr.label.., ..n.label.., sep = "~`,`~"), family = "Arial")
  )

pet2 <- ggplot(yaku_sp, aes(x = petiole_ratio, y = LA)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  xlab("Petiole / leaf dry mass ratio") +
  ylab(expression(Leaf~area~(g~cm^2))) +
  geom_smooth(method = "lm") +
  stat_cor(
    aes(label = paste(..rr.label.., ..n.label.., sep = "~`,`~"), family = "Arial")
  )

pet3 <- pet2 + pet1 +
  plot_annotation(tag_levels = "a") &
  theme(plot.tag = element_text(face = "bold"))

ggsave("../figs/petiole.png", pet3, width = 8, height = 4)

10 Computing Environment

devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 4.1.2 (2021-11-01)
##  os       macOS Big Sur 11.6.1        
##  system   aarch64, darwin20.6.0       
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       Asia/Shanghai               
##  date     2021-12-15                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package      * version   date       lib source                            
##  abind          1.4-5     2016-07-21 [1] CRAN (R 4.1.0)                    
##  assertthat     0.2.1     2019-03-21 [1] CRAN (R 4.1.0)                    
##  backports      1.2.1     2020-12-09 [1] CRAN (R 4.1.0)                    
##  bit            4.0.4     2020-08-04 [1] CRAN (R 4.1.0)                    
##  bit64          4.0.5     2020-08-30 [1] CRAN (R 4.1.0)                    
##  broom          0.7.10    2021-10-31 [1] CRAN (R 4.1.2)                    
##  bslib          0.2.5.1   2021-05-18 [1] CRAN (R 4.1.0)                    
##  cachem         1.0.5     2021-05-15 [1] CRAN (R 4.1.0)                    
##  callr          3.7.0     2021-04-20 [1] CRAN (R 4.1.0)                    
##  car            3.0-10    2020-09-29 [1] CRAN (R 4.1.0)                    
##  carData        3.0-4     2020-05-22 [1] CRAN (R 4.1.0)                    
##  cellranger     1.1.0     2016-07-27 [1] CRAN (R 4.1.0)                    
##  cli            3.1.0     2021-10-27 [1] CRAN (R 4.1.2)                    
##  codetools      0.2-18    2020-11-04 [2] CRAN (R 4.1.2)                    
##  colorspace     2.0-2     2021-06-24 [1] CRAN (R 4.1.0)                    
##  crayon         1.4.1     2021-02-08 [1] CRAN (R 4.1.0)                    
##  curl           4.3.2     2021-06-23 [1] CRAN (R 4.1.0)                    
##  data.table     1.14.0    2021-02-21 [1] CRAN (R 4.1.0)                    
##  DBI            1.1.1     2021-01-15 [1] CRAN (R 4.1.0)                    
##  dbplyr         2.1.1     2021-04-06 [1] CRAN (R 4.1.0)                    
##  desc           1.3.0     2021-03-05 [1] CRAN (R 4.1.0)                    
##  devtools       2.4.2     2021-06-07 [1] CRAN (R 4.1.1)                    
##  digest         0.6.27    2020-10-24 [1] CRAN (R 4.1.0)                    
##  dplyr        * 1.0.7     2021-06-18 [1] CRAN (R 4.1.0)                    
##  ellipsis       0.3.2     2021-04-29 [1] CRAN (R 4.1.0)                    
##  evaluate       0.14      2019-05-28 [1] CRAN (R 4.1.0)                    
##  fansi          0.5.0     2021-05-25 [1] CRAN (R 4.1.0)                    
##  farver         2.1.0     2021-02-28 [1] CRAN (R 4.1.0)                    
##  fastmap        1.1.0     2021-01-25 [1] CRAN (R 4.1.0)                    
##  forcats      * 0.5.1     2021-01-27 [1] CRAN (R 4.1.0)                    
##  foreign        0.8-81    2020-12-22 [2] CRAN (R 4.1.2)                    
##  fs             1.5.0     2020-07-31 [1] CRAN (R 4.1.0)                    
##  generics       0.1.0     2020-10-31 [1] CRAN (R 4.1.0)                    
##  ggplot2      * 3.3.5     2021-06-25 [1] CRAN (R 4.1.0)                    
##  ggpubr       * 0.4.0.999 2021-12-14 [1] Github (mattocci27/ggpubr@901fdeb)
##  ggsignif       0.6.3     2021-09-09 [1] CRAN (R 4.1.2)                    
##  ggsma        * 0.1.0     2021-07-01 [1] Github (mattocci27/ggsma@2b56c57) 
##  glue           1.4.2     2020-08-27 [1] CRAN (R 4.1.0)                    
##  gtable         0.3.0     2019-03-25 [1] CRAN (R 4.1.0)                    
##  haven          2.4.1     2021-04-23 [1] CRAN (R 4.1.0)                    
##  highr          0.9       2021-04-16 [1] CRAN (R 4.1.0)                    
##  hms            1.1.0     2021-05-17 [1] CRAN (R 4.1.0)                    
##  htmltools      0.5.1.1   2021-01-22 [1] CRAN (R 4.1.0)                    
##  httr           1.4.2     2020-07-20 [1] CRAN (R 4.1.0)                    
##  jquerylib      0.1.4     2021-04-26 [1] CRAN (R 4.1.0)                    
##  jsonlite       1.7.2     2020-12-09 [1] CRAN (R 4.1.0)                    
##  kableExtra   * 1.3.4     2021-02-20 [1] CRAN (R 4.1.0)                    
##  knitr        * 1.33      2021-04-24 [1] CRAN (R 4.1.0)                    
##  labeling       0.4.2     2020-10-20 [1] CRAN (R 4.1.0)                    
##  lattice        0.20-45   2021-09-22 [2] CRAN (R 4.1.2)                    
##  lifecycle      1.0.0     2021-02-15 [1] CRAN (R 4.1.0)                    
##  lmtest         0.9-38    2020-09-09 [1] CRAN (R 4.1.1)                    
##  lubridate      1.7.10    2021-02-26 [1] CRAN (R 4.1.0)                    
##  magrittr       2.0.1     2020-11-17 [1] CRAN (R 4.1.0)                    
##  Matrix         1.3-4     2021-06-01 [2] CRAN (R 4.1.2)                    
##  memoise        2.0.0     2021-01-26 [1] CRAN (R 4.1.0)                    
##  mgcv           1.8-38    2021-10-06 [2] CRAN (R 4.1.2)                    
##  modelr         0.1.8     2020-05-19 [1] CRAN (R 4.1.0)                    
##  munsell        0.5.0     2018-06-12 [1] CRAN (R 4.1.0)                    
##  nlme           3.1-152   2021-02-04 [1] CRAN (R 4.1.0)                    
##  openxlsx       4.2.4     2021-06-16 [1] CRAN (R 4.1.0)                    
##  patchwork    * 1.1.1     2020-12-17 [1] CRAN (R 4.1.0)                    
##  pillar         1.6.4     2021-10-18 [1] CRAN (R 4.1.1)                    
##  pkgbuild       1.2.0     2020-12-15 [1] CRAN (R 4.1.0)                    
##  pkgconfig      2.0.3     2019-09-22 [1] CRAN (R 4.1.0)                    
##  pkgload        1.2.1     2021-04-06 [1] CRAN (R 4.1.0)                    
##  prettyunits    1.1.1     2020-01-24 [1] CRAN (R 4.1.0)                    
##  processx       3.5.2     2021-04-30 [1] CRAN (R 4.1.0)                    
##  ps             1.6.0     2021-02-28 [1] CRAN (R 4.1.0)                    
##  purrr        * 0.3.4     2020-04-17 [1] CRAN (R 4.1.0)                    
##  R6             2.5.0     2020-10-28 [1] CRAN (R 4.1.0)                    
##  RColorBrewer   1.1-2     2014-12-07 [1] CRAN (R 4.1.0)                    
##  Rcpp           1.0.6     2021-01-15 [1] CRAN (R 4.1.0)                    
##  readr        * 2.0.2     2021-09-27 [1] CRAN (R 4.1.1)                    
##  readxl         1.3.1     2019-03-13 [1] CRAN (R 4.1.0)                    
##  remotes        2.4.0     2021-06-02 [1] CRAN (R 4.1.0)                    
##  reprex         2.0.0     2021-04-02 [1] CRAN (R 4.1.0)                    
##  rio            0.5.27    2021-06-21 [1] CRAN (R 4.1.0)                    
##  rlang          0.4.11    2021-04-30 [1] CRAN (R 4.1.0)                    
##  rmarkdown      2.9       2021-06-15 [1] CRAN (R 4.1.0)                    
##  rprojroot      2.0.2     2020-11-15 [1] CRAN (R 4.1.0)                    
##  rstatix        0.7.0     2021-02-13 [1] CRAN (R 4.1.0)                    
##  rstudioapi     0.13      2020-11-12 [1] CRAN (R 4.1.0)                    
##  rvest          1.0.0     2021-03-09 [1] CRAN (R 4.1.0)                    
##  sass           0.4.0     2021-05-12 [1] CRAN (R 4.1.0)                    
##  scales         1.1.1     2020-05-11 [1] CRAN (R 4.1.0)                    
##  sessioninfo    1.1.1     2018-11-05 [1] CRAN (R 4.1.0)                    
##  smatr        * 3.4-8     2018-03-18 [1] CRAN (R 4.1.0)                    
##  stringi        1.6.2     2021-05-17 [1] CRAN (R 4.1.0)                    
##  stringr      * 1.4.0     2019-02-10 [1] CRAN (R 4.1.0)                    
##  svglite        2.0.0     2021-02-20 [1] CRAN (R 4.1.0)                    
##  systemfonts    1.0.2     2021-05-11 [1] CRAN (R 4.1.0)                    
##  testthat       3.0.3     2021-06-16 [1] CRAN (R 4.1.0)                    
##  tibble       * 3.1.5     2021-09-30 [1] CRAN (R 4.1.1)                    
##  tictoc       * 1.0.1     2021-04-19 [1] CRAN (R 4.1.0)                    
##  tidyr        * 1.1.4     2021-09-27 [1] CRAN (R 4.1.1)                    
##  tidyselect     1.1.1     2021-04-30 [1] CRAN (R 4.1.0)                    
##  tidyverse    * 1.3.1     2021-04-15 [1] CRAN (R 4.1.1)                    
##  tzdb           0.1.2     2021-07-20 [1] CRAN (R 4.1.1)                    
##  usethis        2.0.1     2021-02-10 [1] CRAN (R 4.1.0)                    
##  utf8           1.2.1     2021-03-12 [1] CRAN (R 4.1.0)                    
##  vctrs          0.3.8     2021-04-29 [1] CRAN (R 4.1.0)                    
##  viridisLite    0.4.0     2021-04-13 [1] CRAN (R 4.1.0)                    
##  vroom          1.5.4     2021-08-05 [1] CRAN (R 4.1.1)                    
##  webshot        0.5.2     2019-11-22 [1] CRAN (R 4.1.0)                    
##  withr          2.4.2     2021-04-18 [1] CRAN (R 4.1.0)                    
##  xfun           0.24      2021-06-15 [1] CRAN (R 4.1.0)                    
##  xml2           1.3.2     2020-04-23 [1] CRAN (R 4.1.0)                    
##  yaml           2.2.1     2020-02-01 [1] CRAN (R 4.1.0)                    
##  zip            2.2.0     2021-05-31 [1] CRAN (R 4.1.0)                    
##  zoo            1.8-9     2021-03-09 [1] CRAN (R 4.1.0)                    
## 
## [1] /opt/homebrew/lib/R/4.1/site-library
## [2] /opt/homebrew/Cellar/r/4.1.2/lib/R/library